import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;


/***********************************************************
 * Codigo que gerencia os objetos do cenario que estao na
 * layer de nome 'objects'.
 *
 ***********************************************************/

 // Esconte o cursor do mouse.
 Mouse.hide();
 // Faz com que cursor mouse seja a luva
 cursorH.startDrag(true);
 
 /** Variaveis gerais da layer objects. **/
 
 // Id do usuario e do seu character conectado (se -1 nao ha usuario conectado)
 var USER_ID:int = new int(1);
 var CHAR_ID:int = new int(1);
 var ID_QUEST_POLE:int = new int(1); // Id da quest do usuario.
 
 // Path geral do projeto.
 const generalPath:String = "http://localhost/workspace/LostDreams/";
 
 // Path para o arquivo php.
 var phpFile:String = generalPath + "place_maps/narukia/php/quests/questPoles.php";
 
 /*** VARIAVEIS DA QUEST POLES/POSTES ***/
 var levelQuestPoles:int = new int(-2);
 /***************************************/
 
 /*** DADOS ESTATICOS ***/
			
		 // Constantes de posicionamento da janela modal.
		 // Array com x y do personagem presente na janela modal.
		 const positionCharacterInModal:Array = [280, 315];
		 // Array com x y do texto do personagem na janela modal.
		 const positionTextInModal:Array = [460, 200];
		 // Array com x y do PRIMEIRO botao na janela modal.
		 const positionFirstButtonInModal:Array = [570, 470];
		 // Array com x y do SEGUNDO botao na janela modal.
		 const positionSecondButtonInModal:Array = [740];
		 // Array com x y do botao OK na janela modal.
		 const positionOKButtonInModal:Array = [670, 470];

		 // Constantes de status da quest poles.
		 const STARTED:Number = 0;
		 const NOTSTARTED:Number = -1;
		 const FINISHED:Number  = 1;
 
  /***********************/
     
     // Consulta as quests do char/character que acessou o place map.
 
     // Parametros da requisicao (usar para todas as requisicoes).
     var paraMeters:URLVariables = new URLVariables();
     paraMeters.callFunction = "getQuestByChar";
     paraMeters.userId = USER_ID;
     paraMeters.charId = CHAR_ID;

     // Preparando requisicao.
     var urlReq:URLRequest = new URLRequest(phpFile);
     urlReq.method = URLRequestMethod.POST;
     urlReq.data = paraMeters;
 
     // Executa requisicao.
     var loader:URLLoader = new URLLoader();
     loader.addEventListener(Event.COMPLETE, loadQuestByChar, false, 0, true);
     loader.load(urlReq);
 
     /**
      * Funcao a ser chamada no retorno da requisicao.
	  * 
      * @param	e
      */
     function loadQuestByChar(e:Event):void {
          try {
              var resPonseLoader:URLLoader = URLLoader(e.target);
              var urlVaribles:URLVariables = new URLVariables(resPonseLoader.data);
			  
              // recebe o status da quest dos poles/postes.
			  levelQuestPoles = urlVaribles["quest_level"]; // level da quest para char do user logado.
			  ID_QUEST_POLE = urlVaribles["id"];
		  
			  // inicia placeMap com base no level da quest.
              checkQuestPoles(urlVaribles["quest_level"], false);
			  
          } catch(e:Error) {
              // exibir erro.
              trace(e);
          }
     }
	 
	 /**
	  * Funcao que avalia o status da quest poles/postes.
	  * 
	  * @param	param
	  * @param	clicouGaroto
	  */
    function checkQuestPoles(param:int, clicouGaroto:Boolean) {
         // Armazena o status da quest carregado do banco.
         levelQuestPoles = param;         
         switch(param) {
             case NOTSTARTED:
                // Todos os postes desligados, (quest nao iniciada).
                if (clicouGaroto) {
					// Posiciona blockPlace sobre o place map com o texto da quest poles/postes.
					showModalBlockWindowJake("Jake\n\n  Os postes parecem estar com algum defeito, mas eu n\u00E3o consigo consertar todos. Voc\u00EA poderia me ajudar?");
                }
             break;
             case STARTED:
                // Todos os postes desligados, (quest somente iniciada).
                if (clicouGaroto) {
					if (polesOn()) {
						 // Parametros da requisicao.
						 var p:URLVariables = new URLVariables();
						 p.callFunction = "updateLevelQuest";
						 p.userId = USER_ID;
						 p.charId = CHAR_ID;
						 p.questLevel = FINISHED; // Quest concluida.
						 p.questId = ID_QUEST_POLE;
						 levelQuestPoles = FINISHED; // TODO avaliar melhor forma de fazer isso.
						 
						 trace(USER_ID +" " +CHAR_ID  );

						 // Preparando requisicao.
						 var urlReq:URLRequest = new URLRequest(phpFile);
						 urlReq.method = URLRequestMethod.POST;
						 urlReq.data = p;

						 // Executa requisicao.
						 var loader:URLLoader = new URLLoader();
						 loader.addEventListener(Event.COMPLETE, setLevelQuest, false, 0, true);
						 loader.load(urlReq);
					} else {
						 showModalBlockWindowJake("Jake\n\n  Os postes continuam com problemas, mas estamos trabalhando nisso. J\u00E1 tentou clicar nos postes?!");
					}
                }               
             break; 
			 case FINISHED:
			 
				// liga os postes.
				ligarPoles();
				
				if (clicouGaroto) {
					showModalBlockWindowJake("Jake\n\n  Serei eternamente grato por sua ajuda!");
				}
			 break;
         }
    }
     
   /** Interacao com o garoto, quest postes/pole. **/
 
   /**
    * Acao do click no garoto.
    * mouseClickBoy(MouseEvent) funcao a ser chamada no evento do click no garoto.
    */
    boyPole.addEventListener(MouseEvent.CLICK, mouseClickBoy, false, 0, true);
   
    // Funcao executada ao se clicar no garoto.
    function mouseClickBoy(e:MouseEvent) :void {
        // Chama funcao que avalia o status da quest dos postes/poles. - levelQuestPoles
        checkQuestPoles(levelQuestPoles, true);
    }
     
    /**
    * Acao do click nos postes/poles.
    * mouseClickPoles(MouseEvent) funcao a ser chamada no evento do click.
    */
    pole1.addEventListener(MouseEvent.CLICK, mouseClickPoles, false, 0, true);
    pole2.addEventListener(MouseEvent.CLICK, mouseClickPoles, false, 0, true);
    pole3.addEventListener(MouseEvent.CLICK, mouseClickPoles, false, 0, true);
    pole4.addEventListener(MouseEvent.CLICK, mouseClickPoles, false, 0, true);
    pole5.addEventListener(MouseEvent.CLICK, mouseClickPoles, false, 0, true);     
 
    /**
     * Funcao executada ao se clicar nos postes/poles.
	 * 
     * @param	e
     */
    function mouseClickPoles(e:MouseEvent) :void {
		// Somente se quest iniciada.
		if (levelQuestPoles == STARTED) {
			// Liga o poste que foi clicado.
			switch(e.target){
			  case pole1:
				pole1.gotoAndStop(2);
			  break;
			  case pole2:
				pole2.gotoAndStop(2);
			  break;
			  case pole3:
				pole3.gotoAndStop(2);
			  break;
			  case pole4:
				pole4.gotoAndStop(2);
			  break;
			  case pole5:
				pole5.gotoAndStop(2);
			  break;
		    }
		}
    }
 
 /***-----------------------------------------***/
 

 
  /***EVENTOS DE CLICK NOS BOTOES DA MODAL ***/

     /**
	 * Adiciona evento no botao btnOK (somente remove a tela modal).
	 */
	 btnOK.addEventListener(MouseEvent.CLICK, declineQuestPole, false, 0, true);
	
	/**
	 * Adiciona evento no botao btnAceitar (gerenciar aceitar quest).
	 */
	 btnAceitar.addEventListener(MouseEvent.CLICK, acceptQuestPole, false, 0, true);
	
	/**
	 * Adiciona evento no botao btnRecusar (somote remove a tela modal).
	 */
     btnRecusar.addEventListener(MouseEvent.CLICK, declineQuestPole, false, 0, true);
	
     /**
      * Funcao executada ao se clicar no botao btnAceitar gerenciar aceita da quet poles/postes.
	  * 
      * @param	e
      */
	function acceptQuestPole(e:MouseEvent) :void {
		
		 createQuestPoles(USER_ID, CHAR_ID);
		
		 // TODO remover blockPlace de sobre o place map.
		 modalDialog.x = 539;
		 modalDialog.y = -346;
		 //modalDialog.gotoAndPlay(1);
		
		 // Posiciona o personagem Jake.
		 jake.x = -262;
		 jake.y = 296;
		 // Posiciona o componente text.
		 textModalQuests.x = 1110;
		 textModalQuests.y = 214;
		 // Posiciona o botao Aceitar.
		 btnAceitar.x = 471;
		 btnAceitar.y = 880;
		 // Posiciona o botao Recusar.
		 btnRecusar.x = 647;
		 btnRecusar.y = 880;
		 // Posiciona o botao Ok.
		 btnOK.x = 647;
		 btnOK.y = 880;
		 
		 // Desejavel tela com garoto contente por receber ajuda?
	}
	
	/**
	 * Funcao que recusa a quest.
	 * 
	 * @param	e
	 */
	function declineQuestPole(e:MouseEvent) :void{
		 // TODO posiciona blockPlace sobre o place map.
		 modalDialog.x = 539;
		 modalDialog.y = -346;
		 //modalDialog.gotoAndPlay(1);
		
		 jake.x = -262;
		 jake.y = 296;
		
		 btnOK.x = 1000;
		 btnOK.y = 1000;
		
		 textModalQuests.x = 1110;
		 textModalQuests.y = 214;
		
		 btnAceitar.x = 471;
		 btnAceitar.y = 880;
		
		 btnRecusar.x = 647;
		 btnRecusar.y = 880;
	}	
	
	/**
	 * Funcao que cria a quest para o char do user.
	 * 
	 * @param	idUser
	 * @param	idChar
	 */
	 function createQuestPoles(idUser:int, idChar:int):void {
	  try { 
		  
		 // Cria a quest poles/postes para o char.
	
		 // Parametros da requisicao.
		 var paraMeters:URLVariables = new URLVariables();
		 paraMeters.callFunction = "criarQuest";
		 paraMeters.userId = idUser;
		 paraMeters.charId = idChar;

		 // Preparando requisicao.
		 var urlReq:URLRequest = new URLRequest(phpFile);
		 urlReq.method = URLRequestMethod.POST;
		 urlReq.data = paraMeters;

		 // Executa requisicao.
		 var loader:URLLoader = new URLLoader();
		 loader.addEventListener(Event.COMPLETE, setIdQuest, false, 0, true);
		 loader.load(urlReq);
		 
	  } catch(e:Error) {
		  // exibir erro.
		  trace(e);
	  }
	}
	
	/**
	 * Configura o ID da quest.
	 * 
	 * @param	e
	 */
	 function setIdQuest(e:Event) :void {
		 var responseLoader:URLLoader = URLLoader(e.target);
		 var urlVaribles:URLVariables = new URLVariables(responseLoader.data); 
		 if (new String(urlVaribles["erro"]) != "undefined" && new String(urlVaribles["erro"]) != "") {
			 trace("Erro ao persistir quest! Erro: " + urlVaribles["erro"]); // TODO Exibir erro.
		 } else {
			 // recebe o retorno da insercao da quest poles/postes.
			 ID_QUEST_POLE = urlVaribles["questId"];
			 levelQuestPoles = STARTED;
		 }
	 }
	 
	 /**
	  * Configura o status da quest.
	  * 
	  * @param	level
	  */
	 function setLevelQuest(e:Event) :void {
		 showModalBlockWindowJake("Jake\n\n  Ufa!!! Muito obrigado pela ajuda, eu n\u00E3o teria conseguido sozinho! Isto \u00E9 para demonstrar minha gratid\u00E3o!");
		 var resPonseLoader:URLLoader = URLLoader(e.target);
		 var urlVaribles:URLVariables = new URLVariables(resPonseLoader.data); 
		 // recebe o retorno da atualizacao da quest poles/postes.
		 if (new String(urlVaribles["erro"]) != "undefined" && new String(urlVaribles["erro"]) != "") {
			 trace("Erro ao atualizar quest! Erro: " + urlVaribles["erro"]); // TODO Exibir erro.
		 } else {
			 levelQuestPoles = urlVaribles["result"]; 
		 }
	 }
	  
 /***-------------------------------------------------***/
 
 /*** FUNCOES GENERICAS ***/
 
 /**
  * Funcao que exibe modal bloqueante com personagem Jake opcoes para quest poles/postes.
  * 
  * @param	dialogText
  */
 function showModalBlockWindowJake(dialogText:String):void {
	// Posiciona blockPlace sobre o place map.
	modalDialog.x = 500;
	modalDialog.y = 350;
	modalDialog.gotoAndPlay(1);
	
	// Insere o texto a ser exibido na dialog.
	textModalQuests.text = dialogText;

	// Timer para para tempos ate toda tela se exibida, em seguida adiciona os objetos da tela.
	var timerShowObjectsOfModalBlockWindow:Timer = new Timer(250, 1);
	timerShowObjectsOfModalBlockWindow.addEventListener(TimerEvent.TIMER, showObjectsOfModalBlockWindow);
	timerShowObjectsOfModalBlockWindow.start();
 }
 
 /**
  * Funcao que configura os componentes que aparecem na tela de bloqueio.
  * 
  * @param	e
  */
 function showObjectsOfModalBlockWindow(e:TimerEvent):void {
	 
	// Posiciona o personagem Jake no modal bloqueante.
	jake.x = positionCharacterInModal[0];
	jake.y = positionCharacterInModal[1];	

	// Posiciona o texto do personagem Jake no modal bloqueante.
	//textModalQuests.text = "Jake\n\n  Os postes parecem estar com algum defeito, mas eu nao consigo consertar todos. Voce poderia me ajudar?";
	textModalQuests.x = positionTextInModal[0];
	textModalQuests.y = positionTextInModal[1];

	if (levelQuestPoles == STARTED || levelQuestPoles == FINISHED) {
		// adiciona botao OK
		btnOK.x = positionOKButtonInModal[0];
		btnOK.y = positionOKButtonInModal[1];
	} else {
		// adciona botao ACEITAR
		btnAceitar.x = positionFirstButtonInModal[0];
		btnAceitar.y = positionFirstButtonInModal[1];
		
		// adiciona botao RECUSAR
		btnRecusar.x = positionSecondButtonInModal[0];
	    btnRecusar.y = positionFirstButtonInModal[1];	
	} 
 }
 
 /**
  * Funcao que liga os poles/postes.
  */
 function ligarPoles():void {
	 pole1.gotoAndStop(2);
	 pole2.gotoAndStop(2);
	 pole3.gotoAndStop(2);
	 pole4.gotoAndStop(2);
	 pole5.gotoAndStop(2);
 }
 
 /**
  * Funcao que informa se todos os postes estao ligados.
  * 
  * @return
  */
 function polesOn():Boolean {
	 return (pole1.currentFrame == 2 && pole2.currentFrame == 2 && pole3.currentFrame == 2 && pole4.currentFrame == 2 && pole5.currentFrame == 2);
 }
 /***-------------------***/